Skip to content

fix(composer): consume icewind deps from GitHub mirrors to survive Codeberg outages - #41707

Merged
DeepDiver1975 merged 2 commits into
masterfrom
fix/composer-mirror-codeberg-deps
Jul 21, 2026
Merged

fix(composer): consume icewind deps from GitHub mirrors to survive Codeberg outages#41707
DeepDiver1975 merged 2 commits into
masterfrom
fix/composer-mirror-codeberg-deps

Conversation

@DeepDiver1975

Copy link
Copy Markdown
Contributor

Problem

CI jobs across owncloud repos intermittently fail because Composer must git-clone icewind/streams and icewind/smb from codeberg.org — neither package publishes a dist archive on Packagist, so a clone is the only option. Codeberg regularly returns HTTP 503, and every downstream app build that runs the "Make local core" step then fails.

Example: owncloud/guests run 29823191682The requested URL returned error: 503 cloning https://codeberg.org/icewind/streams.

Fix

Add VCS repositories entries pointing at GitHub mirrors of the two packages. GitHub serves a dist zipball via its API, so Composer downloads a zip and never touches Codeberg at install time. Package versions in require are unchanged.

"repositories": [
    { "type": "vcs", "url": "https://github.com/DeepDiver1975/streams" },
    { "type": "vcs", "url": "https://github.com/DeepDiver1975/SMB" }
]

icewind/streams in composer.lock now resolves from github.com/DeepDiver1975/streams with a GitHub dist zipball at the same pinned ref (cb2bd3e).

Why this is a draft

icewind/smb still resolves from Codeberg in the lock. Its mirror (DeepDiver1975/SMB) is not yet populated: Codeberg is currently down (503), and the locked version 3.8.1 is newer than any tag on the upstream author's GitHub, so it can't be bootstrapped from anywhere else. Once Codeberg recovers, the codeberg-mirrors sync populates the SMB mirror, then I'll re-run composer update icewind/smb and mark ready — at which point no codeberg.org remains in the lock.

Mirror maintenance

Mirrors are kept in sync weekly (and on demand) by DeepDiver1975/codeberg-mirrors, which force-mirrors both Codeberg repos into GitHub with clone retry/backoff.

Note: mirrors currently live under a personal account (DeepDiver1975). Moving them under the owncloud org would remove the single-account dependency for load-bearing CI infra — worth considering as a follow-up.

🤖 Generated with Claude Code

…Codeberg outages

owncloud CI intermittently fails because Composer must git-clone
icewind/streams and icewind/smb from codeberg.org (no dist archive on
Packagist), and Codeberg regularly returns HTTP 503. Every downstream app
build that runs "Make local core" is affected.

Add VCS repositories pointing at GitHub mirrors so Composer fetches a dist
zipball via the GitHub API and never touches Codeberg at install time.

icewind/streams is switched over now. icewind/smb still resolves from
Codeberg in the lock: its mirror (DeepDiver1975/SMB) is not yet populated
because Codeberg is currently down and the package version (3.8.1) is newer
than any upstream GitHub tag, so it cannot be bootstrapped. Kept as draft
until the mirror is synced and the lock fully repointed.

Mirrors are kept in sync weekly by DeepDiver1975/codeberg-mirrors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Thomas Müller <1005065+DeepDiver1975@users.noreply.github.com>
@update-docs

update-docs Bot commented Jul 21, 2026

Copy link
Copy Markdown

Thanks for opening this pull request! The maintainers of this repository would appreciate it if you would create a changelog item based on your changes.

The DeepDiver1975/SMB mirror is now populated (Codeberg recovered), so
icewind/smb resolves from GitHub with a dist zipball at the same pinned
ref. No codeberg.org references remain in composer.lock.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Thomas Müller <1005065+DeepDiver1975@users.noreply.github.com>
@DeepDiver1975
DeepDiver1975 marked this pull request as ready for review July 21, 2026 13:03
@DeepDiver1975
DeepDiver1975 requested a review from a team as a code owner July 21, 2026 13:03
@DeepDiver1975
DeepDiver1975 merged commit 5c110bd into master Jul 21, 2026
29 checks passed
@DeepDiver1975
DeepDiver1975 deleted the fix/composer-mirror-codeberg-deps branch July 21, 2026 13:28
oc-tmueller added a commit that referenced this pull request Sep 7, 2026
…deberg outages [10.16] (#41816)

fix(composer): consume icewind deps from GitHub mirrors to survive Codeberg outages

Backport of #41707 to 10.16.

owncloud CI intermittently fails because Composer must git-clone
icewind/streams and icewind/smb from codeberg.org (no dist archive on
Packagist), and Codeberg regularly returns HTTP 503/504. Every job that
installs Composer dependencies is affected, including "Make local core"
in downstream app builds.

Add VCS repositories pointing at the GitHub mirrors so Composer fetches a
dist zipball via the GitHub API and never touches Codeberg at install time.

Unlike master, 10.16 stays on icewind/smb v3.7.0: the 3.8.x line requires
php >= 8.2 while this branch pins platform php 7.4. Both packages are
re-locked at the exact refs already in the lock (smb e6904cb, streams
cb2bd3e), which the mirrors carry, so this is a pure source repoint with
no version change. No codeberg.org references remain in composer.lock.

Mirrors are kept in sync weekly by DeepDiver1975/codeberg-mirrors.

Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
oc-tmueller added a commit that referenced this pull request Sep 7, 2026
…deberg outages [10.16] (#41816)

fix(composer): consume icewind deps from GitHub mirrors to survive Codeberg outages

Backport of #41707 to 10.16.

owncloud CI intermittently fails because Composer must git-clone
icewind/streams and icewind/smb from codeberg.org (no dist archive on
Packagist), and Codeberg regularly returns HTTP 503/504. Every job that
installs Composer dependencies is affected, including "Make local core"
in downstream app builds.

Add VCS repositories pointing at the GitHub mirrors so Composer fetches a
dist zipball via the GitHub API and never touches Codeberg at install time.

Unlike master, 10.16 stays on icewind/smb v3.7.0: the 3.8.x line requires
php >= 8.2 while this branch pins platform php 7.4. Both packages are
re-locked at the exact refs already in the lock (smb e6904cb, streams
cb2bd3e), which the mirrors carry, so this is a pure source repoint with
no version change. No codeberg.org references remain in composer.lock.

Mirrors are kept in sync weekly by DeepDiver1975/codeberg-mirrors.

Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
oc-tmueller added a commit that referenced this pull request Sep 7, 2026
…0.16] (#41819)

* fix: avoid a deprecation notice when hashing the file cache path on Oracle

Oracle cannot store empty strings, so the file cache converts them to
null before writing a row. For the storage root, whose path is the empty
string, that left md5() being called with null: PHP 8 reports that as a
deprecated implicit null to string conversion, which is noise in the log
and an error under PHPUnit's strict error handling. The stored path_hash
itself was never wrong, because md5(null) coerces to md5('').

Found by running the PHPUnit DB suite against Oracle.

Backport of #41808

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>

* tmp: debug oracle client on php 7.4

To be dropped before merge.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>

* fix(composer): consume icewind deps from GitHub mirrors to survive Codeberg outages [10.16] (#41816)

fix(composer): consume icewind deps from GitHub mirrors to survive Codeberg outages

Backport of #41707 to 10.16.

owncloud CI intermittently fails because Composer must git-clone
icewind/streams and icewind/smb from codeberg.org (no dist archive on
Packagist), and Codeberg regularly returns HTTP 503/504. Every job that
installs Composer dependencies is affected, including "Make local core"
in downstream app builds.

Add VCS repositories pointing at the GitHub mirrors so Composer fetches a
dist zipball via the GitHub API and never touches Codeberg at install time.

Unlike master, 10.16 stays on icewind/smb v3.7.0: the 3.8.x line requires
php >= 8.2 while this branch pins platform php 7.4. Both packages are
re-locked at the exact refs already in the lock (smb e6904cb, streams
cb2bd3e), which the mirrors carry, so this is a pure source repoint with
no version change. No codeberg.org references remain in composer.lock.

Mirrors are kept in sync weekly by DeepDiver1975/codeberg-mirrors.

Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

* fix(db): introspect the Oracle schema in a fixed number of queries [10.16]

doctrine/dbal 2.13 describes a schema table by table: for every table it runs
one query for the columns, one for the indexes, one for the foreign keys and
one for the table comment. Every one of those inlines the table name as a
literal, so Oracle cannot share cursors and hard parses each of them at a cost
of a few hundred milliseconds. OC\DB\Migrator asks for the full schema once
per applied migration, which multiplies that per-table cost by the number of
migrations.

Add an OracleSchemaManager that reads the whole data dictionary in a fixed
number of queries and use it for Oracle connections. Reading a 48 table schema
drops from 194 to 6 queries, and occ maintenance:install against Oracle on
PHP 7.4 drops from 43 minutes to 30 seconds. doctrine/dbal itself works this
way from 3.4 onwards, so master is unaffected; its 3.x line cannot be pulled
into 10.16 because it changes public API that third-party apps rely on.

The introspected schema is unchanged. The added test asserts that the batched
result is identical to the stock one according to Doctrine's Comparator, and
that the query count does not grow with the number of tables.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>

---------

Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
oc-tmueller added a commit that referenced this pull request Sep 7, 2026
…0.16] (#41819)

* fix: avoid a deprecation notice when hashing the file cache path on Oracle

Oracle cannot store empty strings, so the file cache converts them to
null before writing a row. For the storage root, whose path is the empty
string, that left md5() being called with null: PHP 8 reports that as a
deprecated implicit null to string conversion, which is noise in the log
and an error under PHPUnit's strict error handling. The stored path_hash
itself was never wrong, because md5(null) coerces to md5('').

Found by running the PHPUnit DB suite against Oracle.

Backport of #41808

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>

* tmp: debug oracle client on php 7.4

To be dropped before merge.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>

* fix(composer): consume icewind deps from GitHub mirrors to survive Codeberg outages [10.16] (#41816)

fix(composer): consume icewind deps from GitHub mirrors to survive Codeberg outages

Backport of #41707 to 10.16.

owncloud CI intermittently fails because Composer must git-clone
icewind/streams and icewind/smb from codeberg.org (no dist archive on
Packagist), and Codeberg regularly returns HTTP 503/504. Every job that
installs Composer dependencies is affected, including "Make local core"
in downstream app builds.

Add VCS repositories pointing at the GitHub mirrors so Composer fetches a
dist zipball via the GitHub API and never touches Codeberg at install time.

Unlike master, 10.16 stays on icewind/smb v3.7.0: the 3.8.x line requires
php >= 8.2 while this branch pins platform php 7.4. Both packages are
re-locked at the exact refs already in the lock (smb e6904cb, streams
cb2bd3e), which the mirrors carry, so this is a pure source repoint with
no version change. No codeberg.org references remain in composer.lock.

Mirrors are kept in sync weekly by DeepDiver1975/codeberg-mirrors.

Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

* fix(db): introspect the Oracle schema in a fixed number of queries [10.16]

doctrine/dbal 2.13 describes a schema table by table: for every table it runs
one query for the columns, one for the indexes, one for the foreign keys and
one for the table comment. Every one of those inlines the table name as a
literal, so Oracle cannot share cursors and hard parses each of them at a cost
of a few hundred milliseconds. OC\DB\Migrator asks for the full schema once
per applied migration, which multiplies that per-table cost by the number of
migrations.

Add an OracleSchemaManager that reads the whole data dictionary in a fixed
number of queries and use it for Oracle connections. Reading a 48 table schema
drops from 194 to 6 queries, and occ maintenance:install against Oracle on
PHP 7.4 drops from 43 minutes to 30 seconds. doctrine/dbal itself works this
way from 3.4 onwards, so master is unaffected; its 3.x line cannot be pulled
into 10.16 because it changes public API that third-party apps rely on.

The introspected schema is unchanged. The added test asserts that the batched
result is identical to the stock one according to Doctrine's Comparator, and
that the query count does not grow with the number of tables.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>

---------

Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
phil-davis pushed a commit that referenced this pull request Sep 8, 2026
…suite against Oracle again [10.16] (#41815)

* ci: run the PHPUnit DB suite against Oracle again

Oracle was never covered by the GitHub Actions workflows: in drone it ran
only in the nightly cron matrix, and that pipeline is not part of the
GitHub Actions setup. Add it as a php-unit.yml matrix entry driven by a
new databases input, served by gvenzl/oracle-free:23-slim-faststart.

Oracle lives in the FREEPDB1 pluggable database, so the installer is
called with a connect string carrying SERVICE_NAME instead of a host.
The oci8 extension is only requested for Oracle jobs, and DB_TYPE is
only exported for Oracle so test-phpunit.sh narrows the run to
--group DB - the other databases keep running the full suite unchanged.

The Oracle job runs on every pull request and shares its display name
with the existing php-unit job, so all databases appear in one group of
checks. It remains a separate job so that a slow or failing Oracle run
cannot cancel the other databases through fail-fast.

Backport of #41808

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>

* fix(db): introspect the Oracle schema in a fixed number of queries [10.16] (#41819)

* fix: avoid a deprecation notice when hashing the file cache path on Oracle

Oracle cannot store empty strings, so the file cache converts them to
null before writing a row. For the storage root, whose path is the empty
string, that left md5() being called with null: PHP 8 reports that as a
deprecated implicit null to string conversion, which is noise in the log
and an error under PHPUnit's strict error handling. The stored path_hash
itself was never wrong, because md5(null) coerces to md5('').

Found by running the PHPUnit DB suite against Oracle.

Backport of #41808

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>

* tmp: debug oracle client on php 7.4

To be dropped before merge.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>

* fix(composer): consume icewind deps from GitHub mirrors to survive Codeberg outages [10.16] (#41816)

fix(composer): consume icewind deps from GitHub mirrors to survive Codeberg outages

Backport of #41707 to 10.16.

owncloud CI intermittently fails because Composer must git-clone
icewind/streams and icewind/smb from codeberg.org (no dist archive on
Packagist), and Codeberg regularly returns HTTP 503/504. Every job that
installs Composer dependencies is affected, including "Make local core"
in downstream app builds.

Add VCS repositories pointing at the GitHub mirrors so Composer fetches a
dist zipball via the GitHub API and never touches Codeberg at install time.

Unlike master, 10.16 stays on icewind/smb v3.7.0: the 3.8.x line requires
php >= 8.2 while this branch pins platform php 7.4. Both packages are
re-locked at the exact refs already in the lock (smb e6904cb, streams
cb2bd3e), which the mirrors carry, so this is a pure source repoint with
no version change. No codeberg.org references remain in composer.lock.

Mirrors are kept in sync weekly by DeepDiver1975/codeberg-mirrors.

Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

* fix(db): introspect the Oracle schema in a fixed number of queries [10.16]

doctrine/dbal 2.13 describes a schema table by table: for every table it runs
one query for the columns, one for the indexes, one for the foreign keys and
one for the table comment. Every one of those inlines the table name as a
literal, so Oracle cannot share cursors and hard parses each of them at a cost
of a few hundred milliseconds. OC\DB\Migrator asks for the full schema once
per applied migration, which multiplies that per-table cost by the number of
migrations.

Add an OracleSchemaManager that reads the whole data dictionary in a fixed
number of queries and use it for Oracle connections. Reading a 48 table schema
drops from 194 to 6 queries, and occ maintenance:install against Oracle on
PHP 7.4 drops from 43 minutes to 30 seconds. doctrine/dbal itself works this
way from 3.4 onwards, so master is unaffected; its 3.x line cannot be pulled
into 10.16 because it changes public API that third-party apps rely on.

The introspected schema is unchanged. The added test asserts that the batched
result is identical to the stock one according to Doctrine's Comparator, and
that the query count does not grow with the number of tables.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>

---------

Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

* ci: drop the temporary Oracle debug instrumentation

The Oracle job carried two pieces of throwaway diagnostics that were only
there to find out why maintenance:install took an hour on this branch: a
"TEMPORARY DEBUG - Oracle client" step probing oci8, the instant client
and a raw connect, and a v$session/v$sql sampler that wrapped the install
in a background job with a 90 minute kill timeout and printed the top SQL
afterwards.

That question is answered - it was doctrine/dbal 2.13's per table schema
introspection, fixed by #41819 - and the install is back to under a
minute, so the instrumentation has no reason to stay. Installing on
Oracle is a plain "php occ ${install_cmd}" again, like every other
database.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>

---------

Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants